﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace UtilZ.Dotnet.Ex.DataStruct
{
    /// <summary>
    /// 定时任务接口
    /// </summary>
    public interface ITimingTask : IDisposable
    {
        /// <summary>
        /// 任务名称
        /// </summary>
        string Name { get; }

        /// <summary>
        /// 执行间隔毫秒数
        /// </summary>
        int IntervalMilliseconds { get; }

        /// <summary>
        /// 执行次数,小于0表示无限,大于等于0表示执行指定次数
        /// </summary>
        int Count { get; }

        /// <summary>
        /// 获取或设置与缓存数据关联的用户定义的数据
        /// </summary>
        object Tag { get; set; }

        /// <summary>
        /// 查检定时任务是否已经执行完成[返回true:执行完成;false:未执行完成]
        /// </summary>
        /// <returns>true:执行完成;false:未执行完成</returns>
        bool IsDone();

        /// <summary>
        /// 执行任务
        /// </summary>
        void Excute();

        /// <summary>
        /// 判断当前任务是否需要执行[true:需要执行;false:不需要执行]
        /// </summary>
        /// <returns>true:需要执行;false:不需要执行</returns>
        bool HasExcute();

        /// <summary>
        /// 获取下次执行需要等待的时长,单位:毫秒
        /// </summary>
        /// <param name="timestamp">当前时间戳</param>
        /// <returns>当前任务到下一次执行的还需要的延迟时间</returns>
        long GetNextExcuteWaitMilliseconds(long timestamp);

        /// <summary>
        /// 更新任务本次执行完成时间戳
        /// </summary>
        void UpdateExcuteTimestamp();
    }

}
